﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace PmSoft.Utilities;

/// <summary>
/// 密码强度帮助类
/// </summary>
public class PasswordChecker
{
    /// <summary>
    /// 检查密码强度
    /// </summary>
    /// <param name="password"></param>
    /// <returns></returns>
    public static PasswordStrength CheckPasswordStrength(string password)
    {
        int score = 0;

        // 密码长度检查
        if (password.Length < 8)
        {
            return PasswordStrength.Weak; // 如果密码长度小于8，返回弱
        } 
        if (!Regex.IsMatch(password, "(?=.*[A-Z])(?=.*[a-z])(?=.*\\d)"))
        { //必须包含包含大写字母、小写字母、数字
            return PasswordStrength.Weak;
        }
        
        if (password.Length >= 10)
        {
            score++; // 如果密码长度大于等于10，给分数加1
        }

        // 包含大写字母、小写字母、数字和特殊字符检查
        if (Regex.IsMatch(password, "[a-z]"))
        {
            score++; // 如果密码包含小写字母，给分数加1
        }
        if (Regex.IsMatch(password, "[A-Z]"))
        {
            score++; // 如果密码包含大写字母，给分数加1
        }
        if (Regex.IsMatch(password, "[0-9]"))
        {
            score++; // 如果密码包含数字，给分数加1
        }
        if (Regex.IsMatch(password, "[^a-zA-Z0-9]"))
        {
            score++; // 如果密码包含特殊字符，给分数加1
        }

        // 最终评分判断密码强度级别
        if (score < 3) // 如果分数小于3，返回弱
        {
            return PasswordStrength.Weak;
        }
        else if (score < 5) // 如果分数小于5，返回中等
        {
            return PasswordStrength.Medium;
        }
        else // 否则返回强
        {
            return PasswordStrength.Strong;
        }
    }
}

public enum PasswordStrength
{
    Weak,    // 弱
    Medium,  // 中等
    Strong   // 强
}
